/*
 * Copyright 2008 Wink Saville
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.saville.serdes;

/* TODO: Add a Serdes exception?? */

abstract public interface ISerdes<T> {
    int serdesId();

    ISerdes<T> make();

    void serialize(SerdesBinary serdesBinary);

    T deserialize(SerdesBinary serdesBinary);

    void serialize(SerdesJson serdesJson);

    T deserialize(SerdesJson serdesJson);

    /*
     * This code should be present in all classes that implement ISerdes or some
     * other technique should be used as ALL classes must register with Serdes
     * prior to deserialization.  Possible other choices could be manifests or
     * maybe annotation.
     */
    // {
    //     if (registered.compareAndSet(0, 1)) {
    //          Serdes.register(serdesId(), this);
    //     }
    // }
    //    
    // private static final AtomicInteger registered = new AtomicInteger();
}
